30 janvier 2017

Architecture symbolique

La composition symbolique du modèle permet de définir:
- Ses entrants et les variables réponse
- Sa structure
- Sa fonction objective (RMSE, MAE, Softmax, …)

data<- mx.symbol.Variable(name = "data")
final<- mx.symbol.FullyConnected(data=data, num_hidden=1, name = "final")
perte<- mx.symbol.LinearRegressionOutput(data=final, name = "perte_lineaire")

De la régression simple au deep learning

Aucun calcul n'est réalisé à cette étape. Seule la structure du modèle est définie afin de déterminer les dépendances de calculs aux fins d'optimisation de l'exécution et la gestion de la mémoire.

data<- mx.symbol.Variable(name = "data")
fc1<- mx.symbol.FullyConnected(data=data, num_hidden=4, name = "fc_1")
act1<- mx.symbol.Activation(data=fc1, act_type="relu", name = "act_1")
final<- mx.symbol.FullyConnected(data=act1, num_hidden=1, name = "final")
perte<- mx.symbol.LinearRegressionOutput(data=final, name = "perte_lineaire")

Du symbole au calcul

Une fois la structure du modèle définie, il reste à mettre en place les composantes qui permettront à l'algorithme de s'exécuter sur les données réelles.

  • Initialisation: spécifie la manière dont sont assignés les paramètres avant l'exécution de l'optimisation.
    • Normal
    • Uniforme
    • Xavier
  • Itérateur de données: module dont l'exécution renvoie les données entrantes les variables réponse.

  • Optimiseur: module qui définit la façon dont les paramètres sont mis à jour à chaque itération.

  • Exécuteur: instance qui exécute les calculs. Il peut y en avoir un seul (CPU) ou plusieurs (multi-GPU).

Itérateur

La tâche de l'itérateur est de fournir aux exécuteurs les données nécessaires aux calculs pour chacune des itérations sur les mini-batch.

Les itérateurs pré-définis sont:

  • mx.io.arrayiter: itérateur prenant un objet array comme entrée
  • mx.io.CSVIter: lecture d'un CSV
  • mx.io.ImageRecordIter: lecture d'images en format binaire

Des itérateurs personnalisés peuvent être construits directement en R, leur performance dépend des fonctionnalités sous-jacentes.

À noter que l'utilisation d'itérateurs sur des CSV ou images permet d'éviter la contrainte de charger la totalité des données en mémoire.

Optimiseur

Exécuteur

Exemple - Régression linéaire personnalisée

data <- mx.symbol.Variable("data")
label <- mx.symbol.Variable("label")
label <- mx.symbol.identity(label, name="label")
fc1 <- mx.symbol.FullyConnected(data=data, num_hidden=1, name="fc1")
fc1 <- mx.symbol.Reshape(data=fc1, shape=c(0), name="fc1_reshape")
perc_err <- mx.symbol.abs(fc1/label-1, name="perc_error")
custom_loss <- mx.symbol.MakeLoss(perc_err, name="loss")
graph.viz(custom_loss, direction="LR", graph.height.px = 160)
model_reg<- mx.model.FeedForward.create(symbol = custom_loss, 
                                        X = train_x, y = train_y, 
                                        eval.data = list(data=test_x, label=test_y),
                                        ctx = mx.cpu(), num.round = 24, 
                                        array.batch.size = 32,
                                        optimizer = "sgd",
                                        learning.rate=0.000001,
                                        momentum=0.9,
                                        wd=0.0001, epoch.end.callback = mx.callback.log.train.metric(1), eval.metric = mx.metric.rmse
)
## Warning in mx.model.select.layout.train(X, y): Auto detect layout of input matrix, use rowmajor..
## Start training with 1 devices
## [1] Train-rmse=24.1800087670197
## [1] Validation-rmse=22.6335869930776
## [2] Train-rmse=24.0300878477281
## [2] Validation-rmse=22.6708376486094
## [3] Train-rmse=24.0707992452394
## [3] Validation-rmse=22.7176125992034
## [4] Train-rmse=24.1181655814092
## [4] Validation-rmse=22.7686102279827
## [5] Train-rmse=24.1685198935669
## [5] Validation-rmse=22.8215426911849
## [6] Train-rmse=24.2202787901638
## [6] Validation-rmse=22.8754213353489
## [7] Train-rmse=24.2720386018322
## [7] Validation-rmse=22.9282619101352
## [8] Train-rmse=24.3217555016691
## [8] Validation-rmse=22.9764323638721
## [9] Train-rmse=24.3670866651649
## [9] Validation-rmse=23.0190863297382
## [10] Train-rmse=24.4068048559524
## [10] Validation-rmse=23.0559792101731
## [11] Train-rmse=24.4398535634287
## [11] Validation-rmse=23.0872859712153
## [12] Train-rmse=24.4668716298295
## [12] Validation-rmse=23.1133190146742
## [13] Train-rmse=24.4886991388051
## [13] Validation-rmse=23.134165832689
## [14] Train-rmse=24.5058598416825
## [14] Validation-rmse=23.1511550106171
## [15] Train-rmse=24.5206837980744
## [15] Validation-rmse=23.1661712487192
## [16] Train-rmse=24.533900910326
## [16] Validation-rmse=23.1800148856976
## [17] Train-rmse=24.5461397618477
## [17] Validation-rmse=23.1927502100125
## [18] Train-rmse=24.5574676317429
## [18] Validation-rmse=23.2044778505744
## [19] Train-rmse=24.567663326875
## [19] Validation-rmse=23.2148402080102
## [20] Train-rmse=24.5766600087251
## [20] Validation-rmse=23.2241971898688
## [21] Train-rmse=24.5848173938563
## [21] Validation-rmse=23.2326224105747
## [22] Train-rmse=24.5920757509759
## [22] Validation-rmse=23.2402938270993
## [23] Train-rmse=24.5984723358433
## [23] Validation-rmse=23.247121509478
## [24] Train-rmse=24.6042160592766
## [24] Validation-rmse=23.253354949684

Réutilisation de modèles pré-entraînés

Un modèle peut être représenté comme la combinaison de 2 composantes:

  • Structure symbolique: graph représentant l'enchaînement des différents opérateurs
  • Paramètres: les poids associés aux opérateurs

Un modèle performant bien à une tâche peut fournir une bonne base pour des tâches connexes.

Exemple: Chat vs Chien avec Resnet Microsoft 2015

  1. Charger le modèles de référence (Resnet)
  2. Adapter la structure au nouveau problème (changer le nombre de neuronnes de la dernière couche de 1000 à 2)
  3. Réutiliser les poids du modèle de référence pour tous les opérateurs saufs ceux qui ont été adaptés.
  4. Initialiser aléatoirement les paramètres qui ne sont pas transférés du modèle de référence.
  5. Run!

Une collection de modèles pré-entraînées est disponible dans le zoo

Analyse de langage avec CNN

Analyse de langage avec RNN

Bucketing

Modèle adversial

Modèle adversial - Définition symbolique

Les modèle adversial recoupe une famille de modèles dont le trait commun est de mettre en compétition 2 sous-modèles:

  • Générateur: à partir de bruit, génère une réponse (image, texte, vecteur…)
  • Discriminateur: identifie si la valeur d'entrée provient d'un échantillon réel ou a plutôt été produit par le générateur

GAN Conditionel sur MNIST